package cn.goktech.util;

import cn.goktech.entity.Column;
import cn.goktech.entity.Table;
import cn.goktech.properties.DBType2JavaType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 生成类之前的处理
 * 主要：
 * 1、对数据类型转换
 */
@Component
public class ClassHandUtil {

    @Autowired
    private   DBType2JavaType dbType2JavaType;

    /**
     *数据库类型转为基本数据类型
     */
    public  List<Table> doTypeChange(List<Table> allTable){
        List<Table> tempTable = new ArrayList<>();
        for (Table table:allTable) {
            //将数据库表明转换为类名
            table.setClassName(this.DBName2ClassName(table.getDbTable()));

            //将表中字段名转换为属性名
           List<Column> templeColumn = new ArrayList<>();
           List<Column> column = table.getTableColumn();
           for(Column item:column){
               item.setColumnType(this.DB2Java(item.getDbColumnType()));//数据库中类型转为JAVA数据类型
               item.setColumnName(DBColunmName2FiledName(item.getDbColumnName()));//将数据库名转为JAVA字段驼峰命名
               templeColumn.add(item);
           }
            table.setTableColumn(templeColumn);
            tempTable.add(table);
        }
        return tempTable;
    }

    public  String DB2Java(String dbType){
        HashMap<String, String> dbType2JavaTypeMap = dbType2JavaType.getDbType2JavaTypeMap();
        return dbType2JavaTypeMap.get(dbType);
    }


    /**
     * 将传入的数据库中列名转为驼峰命名的格式
     * @param dbColumnName
     * @return
     */
    public  String DBColunmName2FiledName(String dbColumnName){
        dbColumnName = dbColumnName.toLowerCase();
        StringBuffer result = new StringBuffer();
        String [] allItem = dbColumnName.split("_");
        if(allItem.length>1){
            result.append(allItem[0]);
            for(int i = 1;i<allItem.length;i++){
                result.append(this.changeKeyFristToUpperCase(allItem[i]));//拼接驼峰命名
            }
        }else{
            result.append(allItem[0]);
        }
        return result.toString();
    }

    /**
     * 将指定数据库表名转换为符合命名规范的驼峰命名
     * @param dbName
     * @return
     */
    public  String DBName2ClassName(String dbName){
        dbName = dbName.toLowerCase();
        StringBuffer sb = new StringBuffer("");
        String [] allItem = dbName.split("_");
        if(allItem.length<=1){
           return changeKeyFristToUpperCase(allItem[0]);
        }else{
          for(int i=1;i<allItem.length;i++){
              sb.append(this.changeKeyFristToUpperCase(allItem[i]));
          }
        }
        return sb.toString();
    }

    /**
     * 将传入字符串的首字母变为大写，其他小写
     * 主要将
     * @param target
     * @return
     */
    public  String changeKeyFristToUpperCase(String target){
       return target.substring(0,1).toUpperCase()+target.substring(1,target.length());
    }
}
